﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DAO;
using DAO.Entity;

namespace TAM_SPORT
{
    public partial class Import : TAM_SPORT.FormBase
    {
        private int reason;
        private ProductDao pdao;
        private ImportDao imDao;
        private int id = 0;

        public Import(int id, bool flag)
        {
            InitializeComponent();
            imDao = new ImportDao();
            txtUserName.Text = LoginDao.fullName;
            pdao = new ProductDao();
            onload(id);
            loadProuct();
            cbxProducts.SelectedIndex = 0;
            this.id = id;
        }

        private void onload(int id)
        {
            DataRow infor = imDao.getImportById(id);
            if (infor != null)
            {
                dtImportAt.Value = DateTime.Parse(infor["IMPORT_DATE"].ToString());
                txtUserName.Text = infor["FULL_NAME"].ToString();
                this.reason = Convert.ToInt32(infor["LY_DO_NHAP"].ToString());
                if (this.reason == 1)
                {
                    txtPrice.Visible = true;
                    lblPrice.Visible = true;
                    clPrice.Visible = true;
                    clTotal.Visible = true;
                    txtTotal.Visible = true;
                    this.Text = "Chi tiêu > Sửa nhập mua hàng";
                }
                else
                {
                    txtPrice.Visible = false;
                    lblPrice.Visible = false;
                    clPrice.Visible = false;
                    clTotal.Visible = false;
                    txtTotal.Visible = false;
                    this.Text = "Chi tiêu > Sửa nhập điều chỉnh";
                }
            }            
            DataTable details = imDao.getImportDetails(id);
            double price = 0;
            double quantity = 0;
            double total = 0;
            if (details != null)
            {
                gvDetails.Rows.Clear();
                foreach (DataRow row1 in details.Rows)
                {
                    int i = gvDetails.Rows.Add();
                    gvDetails.Rows[i].Cells[0].Value = i + 1;
                    gvDetails.Rows[i].Cells[1].Value = row1["PRODUCT_ID"].ToString();
                    gvDetails.Rows[i].Cells[2].Value = row1["NAME"].ToString();
                    gvDetails.Rows[i].Cells[3].Value = row1["UNIT_NAME"].ToString();
                    gvDetails.Rows[i].Cells[4].Value = Convert.ToDouble(row1["QUANTITY"]).ToString("#,###.##");
                    quantity = Convert.ToDouble(row1["QUANTITY"]);
                    if (this.reason == 1)
                    {
                        price = Convert.ToDouble(row1["PRICE"]);
                        total += price * quantity;
                        gvDetails.Rows[i].Cells[5].Value = Convert.ToDouble(row1["PRICE"]).ToString("#,###.##");
                        gvDetails.Rows[i].Cells[6].Value = total.ToString("#,###.##");
                        txtTotal.Text = getTotal().ToString("#,###.##");
                    }
                }
            }
        }
        public Import(int reason)
        {
            InitializeComponent();
            imDao = new ImportDao();
            this.reason = reason;
            txtUserName.Text = LoginDao.fullName;
            pdao = new ProductDao();
            loadProuct();
            cbxProducts.SelectedIndex = 0;
            if (this.reason == 2)
            {
                txtPrice.Visible = false;
                lblPrice.Visible = false;
                clPrice.Visible = false;
                clTotal.Visible = false;
                txtTotal.Visible = false;
                this.Text = "Chi tiêu > Nhập điều chỉnh";
            }
            else
            {
                txtPrice.Visible = true;
                lblPrice.Visible = true;
                clPrice.Visible = true;
                clTotal.Visible = true;
                txtTotal.Visible = true;
                this.Text = "Chi tiêu > Nhập mua hàng";
            }
        }

        public Import()
        {
            InitializeComponent();
        }


        private void loadProuct()
        {
            DataTable table = pdao.getProducts(string.Empty);
            cbxProducts.DataSource = table;
            DataRow row = table.NewRow();
            row["ID"] = -1;
            row["NAME"] = "Chọn sản phầm";
            table.Rows.InsertAt(row, 0);
            cbxProducts.DisplayMember = "NAME";
            cbxProducts.ValueMember = "ID";
        }

        private String RemoveComma(String value)
        {
            if (value != null && value.Contains(","))
            {
                value = value.Replace(",", String.Empty).Trim();
            }
            return value;
        }

        private void txtQuantity_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txtQuantity_TextChanged(object sender, EventArgs e)
        {
            if (RemoveComma(txtQuantity.Text).Length > 3)
            {
                txtQuantity.Text = decimal.Parse(RemoveComma(txtQuantity.Text)).ToString("#,###");
                txtQuantity.Select(txtQuantity.Text.Length, 0);
            }
        }

        private void txtPrice_TextChanged(object sender, EventArgs e)
        {
            if (RemoveComma(txtPrice.Text).Length > 3)
            {
                txtPrice.Text = decimal.Parse(RemoveComma(txtPrice.Text)).ToString("#,###");
                txtPrice.Select(txtPrice.Text.Length, 0);
            }
        }

        private void txtPrice_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
            }
        }


        private bool checkDiplicate(int productId)
        {
            int prId = 0;
            for (int i = 0; i < gvDetails.RowCount; i++)
            {
                int.TryParse(gvDetails.Rows[i].Cells[1].Value.ToString(), out prId);
                if (productId == prId)
                {
                    return true;
                }
            }
            return false;
        }

        private double getTotal()
        {
            if (this.reason == 1)
            {
                double price = 0;
                double quantity = 0;
                double total = 0;
                for (int i = 0; i < gvDetails.RowCount; i++)
                {
                    double.TryParse(gvDetails.Rows[i].Cells[5].Value.ToString(), out price);
                    double.TryParse(gvDetails.Rows[i].Cells[4].Value.ToString(), out quantity);
                    total += quantity * price;
                }
                return total;
            }
            else
            {
                return 0;
            }
        }
        private void btnAdd_Click(object sender, EventArgs e)
        {
            string error = "";
            if (cbxProducts.SelectedIndex <= 0)
            {
                error = "Bạn chưa chọn hàng hóa nhập";
                Error er = new Error(error);
                er.ShowDialog();
                er.Dispose();
            }
            else
            {
                int productId = Convert.ToInt32(cbxProducts.SelectedValue);
                if (!checkDiplicate(productId))
                {
                    float price = 0;
                    float quantity = 0;
                    float.TryParse(txtPrice.Text.Replace(",", ""), out price);
                    float.TryParse(txtQuantity.Text.Replace(",", ""), out quantity);
                    if (quantity <= 0)
                    {
                        error += "\n";
                        error = "Số lượng nhập phải là số nguyên dương.";
                    }
                    if (string.IsNullOrEmpty(error))
                    {
                        int i = gvDetails.Rows.Add();
                        gvDetails.Rows[i].Cells[0].Value = i + 1;
                        gvDetails.Rows[i].Cells[1].Value = productId;
                        gvDetails.Rows[i].Cells[2].Value = cbxProducts.Text;
                        gvDetails.Rows[i].Cells[3].Value = txtUnit.Text;
                        gvDetails.Rows[i].Cells[4].Value = quantity.ToString("#,###.##");
                        if (this.reason == 1)
                        {
                            gvDetails.Rows[i].Cells[5].Value = price.ToString("#,##0.00");
                            gvDetails.Rows[i].Cells[6].Value = (price * quantity).ToString("#,##0.00");
                            if (this.reason == 1)
                            {
                                txtTotal.Text = getTotal().ToString("#,###.##");
                            }
                        }
                        cbxProducts.SelectedIndex = 0;
                        txtPrice.Text = "0";
                        txtQuantity.Text = "1";
                    }
                    else
                    {
                        Error er = new Error(error);
                        er.ShowDialog();
                        er.Dispose();
                    }
                }
                else
                {
                    Error er = new Error("Nhập trùng sản phẩm");
                    er.ShowDialog();
                    er.Dispose();
                }
            }
            
        }

        private void Import_Load(object sender, EventArgs e)
        {

        }

        private void gvDetails_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            if (this.reason == 1)
            {
                txtTotal.Text = getTotal().ToString("#,###.##");
            }
        }

        private List<ImportDetailEntity> getDetails()
        {
            List<ImportDetailEntity> details = new List<ImportDetailEntity>();
            ImportDetailEntity detail;
            if (gvDetails.RowCount <= 0)
            {
                return null;
            }
            else
            {
                for (int i = 0; i < gvDetails.RowCount; i++)
                {
                    detail = new ImportDetailEntity();
                    detail.ProductId = Convert.ToInt32(gvDetails.Rows[i].Cells[1].Value.ToString());
                    detail.Quantity = float.Parse(gvDetails.Rows[i].Cells[4].Value.ToString().Replace(",", ""));
                    if (this.reason == 1)
                    {
                        detail.Price = float.Parse(gvDetails.Rows[i].Cells[5].Value.ToString().Replace(",", ""));                        
                    }
                    else
                    {
                        detail.Price = 0;
                    }
                    details.Add(detail);
                }
            }
            return details;
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (gvDetails.RowCount <= 0)
            {
                Error er = new Error("Bạn chưa nhập hàng hóa. Vui lòng nhập lại");
                er.ShowDialog();
                er.Dispose();
            }
            else
            {
                if (this.id <= 0)
                {
                    if (imDao.Import(dtImportAt.Value, LoginDao.userID, this.reason, getDetails()))
                    {
                        Result re = new Result(UserConstant.SAVE_SUCCESSFUL);
                        gvDetails.Rows.Clear();
                        dtImportAt.Value = DateTime.Now;
                        if (this.reason == 1)
                        {
                            txtTotal.Text = "0";
                        }
                        re.ShowDialog();
                        re.Dispose();
                    }
                    else
                    {
                        Error er = new Error("Nhập hàng thất bại. Vui lòng thực hiện lại");
                        er.ShowDialog();
                        er.Dispose();
                    }
                }
                else
                {
                    if (imDao.updateimport(this.id, dtImportAt.Value, LoginDao.userID, this.reason, getDetails()))
                    {
                        Result re = new Result(UserConstant.SAVE_SUCCESSFUL);
                        gvDetails.Rows.Clear();
                        dtImportAt.Value = DateTime.Now;
                        if (this.reason == 1)
                        {
                            txtTotal.Text = "0";
                        }
                        re.ShowDialog();
                        re.Dispose();
                        this.Close();
                    }
                    else
                    {
                        Error er = new Error("Sửa phiếu nhập thất bại. Vui lòng thực hiện lại");
                        er.ShowDialog();
                        er.Dispose();
                    }
                }
            }
        }

        private void cbxProducts_SelectedIndexChanged(object sender, EventArgs e)
        {
            int productId = 0;
            if (cbxProducts.SelectedIndex >= 1)
            {
                int.TryParse(cbxProducts.SelectedValue.ToString(), out productId);
                if (productId > 0)
                {
                    DataRow row =  pdao.getProDuctById(productId);
                    if (row != null)
                    {
                        txtUnit.Text = row["UNIT_NAME"].ToString();
                    }
                }
                else
                {
                    txtUnit.Text = "";
                }
            }
            else
            {
                txtUnit.Text = "";
            }
        }
    }
}
